----------------------------------------------------------------------------------
-- project : kproj 3-4
-- project groep: 1
-- gemaakt door:  Freek Pronk
--
-- omschrijving : Dit deel van het programma zorgt er voor dat de paritie wordt gecontroleerd
-- dit wordt gedaan met de pakketen start,adres,leeg en 10 data pakketten.
-- er wordt een even paritiy bit verwacht.
-- er wordt gekeken naar regels(dus van boven naar beneden per bit).
-- dit moet dan kloppen met de data paket waarde parity in staat. 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity parity_controle is
port(
		klok		 	: in std_logic;
		enable		: in std_logic;
		reset			: in std_logic;
--		Write_En_out: out std_logic;
		datapaket	: in std_logic_vector(7 downto 0);
--		vorig_parity: in std_logic_vector(7 downto 0);
--		parity 	  	: out std_logic_vector(7 downto 0);
		teller_out 	: out std_logic_vector(3 downto 0);
		parity_oke 	: out std_logic);
end parity_controle;

architecture Behavioral of parity_controle is
signal tel					: integer range 0 to 15 := 0;
Signal latch 				: std_logic:= '0';
signal parity_oke_hulp 	: std_logic:= '0';
signal vorig_parity		: std_logic_vector(7 downto 0);

begin
	process(klok)
	begin
	-- hier worden alle waardes gereset.
	if (enable = '0' or reset = '1') then
		tel <= 0;
		vorig_parity <= (others => '0');
		parity_oke_hulp <= '0';
		latch <= '0';
	else
		if rising_edge(klok) then
		-- hier wordt gekeken of enable hoog is.
		-- indien latch nog niet hoog was begind de parity controlle
		-- latch wordt gebruikt omdat de teller 1 klokpuls op voor moet liggen
		-- omdat de datapaket 1 klokpuls nodig heeft om uit het ram te komen.
			if (enable = '1' and latch = '0') then
				latch <= '1';
				tel <= tel +1;
			end if;
			if latch = '1' then 
				if tel = 14 then 
					-- vergelijkt de berekende parity met ontvangen data.
					if vorig_parity = datapaket then 
						parity_oke_hulp <= '1';
					end if; 
				else
				-- hier wordt de parity berekent.
					vorig_parity <= (vorig_parity xor datapaket);
					tel <= tel +1;
					--parity_oke_hulp <= '0';
				end if;
			else
				-- als latch niet hoog is moeten deze waardes laag blijven.
				vorig_parity <= "00000000";
				parity_oke_hulp <= '0';
			end if;
		end if;
	end if;
	end process; 
	parity_oke <= parity_oke_hulp;
	teller_out <= std_logic_vector(to_signed(tel,4));
end Behavioral;


-----------------------------------------------------------------------

-- package
library ieee;
use ieee.std_logic_1164.all;

package parity is

component parity_controle is
port(
		klok		 	: in std_logic;
		enable		: in std_logic;
		reset			: in std_logic;
--		Write_En_out: out std_logic;
		datapaket	: in std_logic_vector(7 downto 0);
--		vorig_parity: in std_logic_vector(7 downto 0);
--		parity 	  	: out std_logic_vector(7 downto 0);
		teller_out 	: out std_logic_vector(3 downto 0);
		parity_oke 	: out std_logic);
end component; 
end parity;
